
\chapter{Logiciel client}


	\section{Généralités}

	Le logiciel client est prévu pour tourner sous android version 2.1 minimum (7\ieme{} version du SDK).
	Il a été testé sur un htc hero (android 2.1) et sur un motorola defy (android 2.1 et android 2.2).

	{\bf TOUS} les fichiers que va généré le logiciel (photo, sons\ldots) sont enregistré
	dans le dossier \verb+tx52+ qui se situe à la racine de la carte SD. Si le dossier
	n'existe pas il est créé au démarrage de l'application. Ce chemin est défini dans
	\verb+DataManager+, qui est la classe qui gère les données de l'application.

	Les fonctions et classes sont documentées en javadoc, nous n'allons donc pas reprendre
	ici chaque méthode pour expliquer le fonctionnement mais reprendre l'architecture globale
	du projet.

	\section{Présentation des packages et fichiers}

		\subsection{Ressources}

			\subsubsection{Images}

				Les images utilisées par l'application se situent dans le dossier \verb+/res/drawable-hdpi/+.

			\subsubsection{Menus}

				\begin{description}
					\item[contactmenu] Le menu de l'activité \verb+Contact+.
					\item[mainmenu] Le menu de l'écran d'accueil.
				\end{description}

			\subsubsection{Layouts}

				\begin{description}
					\item[addcomment] La fenêtre de partage (\verb+CommentAdder+), ajout de commentaires avant l'envoi.
					\item[contact] La fenêtre de gestion de la liste des contacts (\verb+Contact+).
					\item[main] L'écran d'accueil (\verb+TX52+)
					\item[seefile] La fenêtre de visionnage d'une photo reçu (\verb+ViewPhoto+).
				\end{description}

			\subsubsection{String}

				\begin{description}
					\item[app\_name] Le nom de l'application
					\item[smscontent] Le contenu du sms qui sera envoyé à un nouvel utilisateur (la procédure d'installation).
					\item[about] Un petit texte qui sera affiché sur l'écran d'accueil de l'application.
				\end{description}


			\subsubsection{Préférences}

				Les éléments qui compose l'écran de préférence sont défini dans le fichier \verb+/xml/preferences.xml+.

				Pour l'instant on retrouve une case à coché pour savoir si l'application tourne en mode simplifié (juste
				recevoir des photos) qui n'est pas utilisée par le logiciel actuellement.

				On trouve aussi un champ pour entrer le numéro de téléphone. Le logiciel essaye de trouver le numéro
				de téléphone de l'utilisateur mais ce numéro peut être erroné ou absent par défaut.


		\subsection{Packages}

			\begin{description}

				\item[tx52] Package racine, il contient \verb+TX52+ qui est l'écran d'accueil et l'activité principale et \verb+Preference+
							qui est l'activité de gestion des préférences de l'application.

				\item[contactManagement] Ce package contient toutes la partie gestion de la liste des contacts. L'activité principale
											étant \verb+Contact+.

				\item[dataManagement] Ce package contient la gestion des données de l'application dont l'enregistrement des préférences
										et l'envoi des sms.

				\item[galerie] La galerie de photo, c'est à dire la possibilité de sélectionner une image déjà présente sur
								le téléphone pour la partager. L'activité principale est \verb+Galerie+.

				\item[photo] Tout ce qui concerne la prise de photo pour le partage direct. L'activité principale est \verb+Photo+.

				\item[reception] La réception et l'envoi de donnée au serveur, grâce à \verb+PullService+ qui est un service qui
								se lance au démarrage de l'application, nous y reviendrons après.

				\item[sharing] La partie partage de la photo (ajout de commentaire\ldots). L'activité principale est \verb+CommentAdder+.

			\end{description}

			{\it Note : } La prise de photo et le parcourt de la galerie sont effectués en utilisant l'API du téléphone, et donc
							peut être différent d'un téléphone à l'autre.

		\subsection{Service}

			Le service \verb+PullService+ est lancé au démarrage de l'application. Il continue a tourner même quand
			on quitte l'application.

			Il garde la socket ouverte pour communiquer avec le serveur. Il écoute les messages entrant\footnote{Voir la partie
			sur le protocole de communication dans la partie serveur} et envoi des messages au serveur.

			Notons qu'il n'y a qu'une instance en mémoire de ce service que l'on peut obtenir avec la méthode statique \verb+getInstance+.

			En cas de perte de connexion avec le serveur, le client va tenter de se reconnecter à celui-ci toutes les 5 secondes. Ce délai
			est défini dans la méthode \verb+onStart+ de \verb+PullService+.

			Ce service créé également les notifications sur le téléphone ne fonction des messages qu'il reçoit du serveur (demande d'ajout
			d'ami et nouvelle photo disponible).


	\section{Permissions}

		Nous allons résumer quelles sont les permissions requises et pourquoi.

		Communication avec le serveur :
		\begin{lstlisting}[language=xml]
<uses-permission android:name="android.permission.INTERNET" />
		\end{lstlisting}

		Pour obtenir le numéro de téléphone du téléphone client :
		\begin{lstlisting}[language=xml]
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
		\end{lstlisting}

		Utilisation de l'appareil photo :
		\begin{lstlisting}[language=xml]
<uses-permission android:name="android.permission.CAMERA"></uses-permission>
<uses-feature android:name="android.hardware.camera"></uses-feature>
<uses-feature android:name="android.hardware.camera.autofocus" />
		\end{lstlisting}

		Construction de la liste des contacts de l'application :
		\begin{lstlisting}[language=xml]
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
		\end{lstlisting}

		Envoi de sms en cas d'ajout de contacts :
		\begin{lstlisting}[language=xml]
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
		\end{lstlisting}

		Enregistrement audio pour l'ajout de commentaires :
		\begin{lstlisting}[language=xml]
<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
		\end{lstlisting}

		\'Ecrire sur la carte SD :
		\begin{lstlisting}[language=xml]
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
		\end{lstlisting}



